<?php defined('SYSPATH') or die('No direct script access.');

class Model_Mailbox extends ORM
{  
    protected $_reload_on_wakeup = false;
    
    const STATUS_ACTIVE  = 'active';
    const STATUS_DELETED = 'deleted';
    
    public function get_mailboxes()
    {
        $mailboxes = $this->_get_mailboxes_query()
                        ->find_all();
        return $mailboxes;         
    }
    
    public function get_mailbox_by_hash($hash)
    {
        $mailbox = $this->_get_mailboxes_query()
                    ->where('hash', '=', $hash)
                    ->find();
        if (!$mailbox->loaded()) {
            throw new HTTP_Exception_404('Такого ящика нет');      
        }
        return $mailbox;
    }
    
    public function get_mailbox_stat()
    {
        // Денормализовать все, кроме прикрепленных мне
        
        $available_filters = Model_Ticket::get_available_filters();
        
        return array(
            Model_Ticket::FILTER_UNASSIGNED => $this->unassigned_count,
            Model_Ticket::FILTER_MINE       => ORM::factory('ticket')->get_tickets_by_filter($this, $available_filters[Model_Ticket::FILTER_MINE], null, true),
            Model_Ticket::FILTER_ASSIGNED   => ORM::factory('ticket')->get_tickets_by_filter($this, $available_filters[Model_Ticket::FILTER_ASSIGNED], null, true),
            Model_Ticket::FILTER_CLOSED     => 0, //$this->closed_count,
            Model_Ticket::FILTER_SPAM       => 0, //$this->spam_count,
        );
    }
    
    public function get_mailbox_redirect()
    {
        if ($this->mailbox_redirect) {
            return $this->mailbox_redirect.'@teamdesk.ru';    
        }
        return 'support.'.$this->id.'.'.$this->hash;    
    }
    
    public function update_mailbox_stat()
    {
        // вызываем при добавлении, удалении и редактировании тикета
        // только активные
        // TODO сбрасываем кеш
        
        $available_filters = Model_Ticket::get_available_filters();
        
        $this->unassigned_count = ORM::factory('ticket')->get_tickets_by_filter($this, $available_filters[Model_Ticket::FILTER_UNASSIGNED], null, true);
        $this->closed_count     = ORM::factory('ticket')->get_tickets_by_filter($this, $available_filters[Model_Ticket::FILTER_CLOSED], null, true);
        $this->spam_count       = ORM::factory('ticket')->get_tickets_by_filter($this, $available_filters[Model_Ticket::FILTER_SPAM], null, true);
        $this->save();
    }
    
    protected function _get_mailboxes_query()
    {
        $company = ORM::factory('company')->get_current();
        if (!$company->loaded()) {
            throw new Model_Exception('Нет компании');   
        }
        
        return ORM::factory('mailbox')
                    ->where('company_id', '=', $company->id)
                    ->where('status', '!=', self::STATUS_DELETED);
    }
    
    public function add_mailbox($email, $name)
    {
        /*if (!Valid::url($url)) {
            throw new Model_Exception('Некорректный адрес магазина');
        } */
        
        $company = ORM::factory('company')->get_current();
        if (!$company->loaded()) {
            throw new Model_Exception('Неизвестная компания');   
        }
        
        $email      = Security::xss_clean($email);
        $name       = Security::xss_clean($name); 
        
        $this->company_id = $company->id;
        $this->hash       = mb_strtolower($this->generate_hash());
        $this->email      = $email;
        $this->name       = $name;
        $this->clean_password = $this->generate_hash(10);
        $this->password   = md5($this->clean_password);
        $this->created    = time();       
        $this->save();
        
        $this->mailbox_redirect = $this->get_mailbox_redirect();
        $this->save();
        
        $this->add_start_tickets();
        
        return $this;  
    }
    
    public function add_start_tickets()
    {        
        $client_name  = 'TeamDesk';
        $email        = 'support@teamdesk.ru';
        $current_user = Model_Auth::instance()->get_user();
        
        $subject = 'Начало работы';
        $text    = "<p>Над этим сообщением находится панель инструментов. При помощи этой панели вы можете ответить на обращение, добавить приватные заметки, назначить ответственного и т.д. Просто наведите курсор на значки, чтобы увидеть все действия, которые вы можете сделать. Также обратите внимание заголовок диалога сразу под панелью инструментов. Вы видите тему обращения, его номер и статус.</p> 
<p>У вас остались вопросы? Просто ответьте на это сообщение, и мы получим ваш комментарий.</p>";
        $ticket = ORM::factory('ticket')->add_ticket($this, Model_Ticket::TYPE_EMAIL, $client_name, $email, null, $subject, $text, Model_Ticket::STATUS_ACTIVE, 0, null, array(), true); 
        
        $text = "<p>Заметки - это отличный способ общаться с другими агентами вашей команды, потому что они не видны для клиентов. Очень удобно оставить заметку для коллеги, если вы назначаете его ответственным за обращение.</p>";
        $note = ORM::factory('note')->add_note($ticket, $text);
        
        $text  = "<p>Привет!</p> 
<p>Так выглядит обращение клиента в службу поддержки. Все письма, отправленные на ваш почтовый ящик будут преобразованы в диалоги. В правом верхнем углу каждого обращения вы видите дату его создания. В правой колонке находится Карточка клиента. Она покажет все, что нужно знать о клиенте, в том числе контактную информацию и историю обращений.</p>";
        $reply = ORM::factory('reply')->add_reply($ticket, $text, $client_name, $email, time() + 10, array(), true);
        
        
        
        $subject = 'Еще немного полезной информации';
        $text    = "<p>Наша команда надеется, что вам понравится TeamDesk и вы сможете создать службу поддержки вашей мечты. Это последнее письмо от нас. Если вам потребуется помощь в настройке переадресации писем, просто напишите нам!</p>
<p>Успехов!</p>";
        $ticket = ORM::factory('ticket')->add_ticket($this, Model_Ticket::TYPE_EMAIL, $client_name, $email, null, $subject, $text, Model_Ticket::STATUS_ACTIVE, $current_user, null, array(), true);
        
        $text = "<p>Вы знали, что в TeamDesk можно фиксировать телефонные звонки или обращения из других источников? Для этого просто создайте такое обращение вручную при помощи кнопки с плюсом в левом столбце. При создании обращения с типом Email, оно будет отправлено адресату на указанную вами почту.</p>";
        $note = ORM::factory('note')->add_note($ticket, $text);
        
        $text  = "<p>Привет!</p> 
<p>Сейчас вы находитесь в папке «Мои», в котором содержатся все обращения, которые являются активными или в ожидании и назначены на вас. Закрытые обращения и Спам хранятся в их собственных папках.</p>
<p>Все обращения, которые назначены на других агентов из вашей команды и при этом Активны или В ожидании находятся в папке «Назначены».</p>
<p>В TeamDesk нет такого понятия, как прочитанное/не прочитанное обращение. Вместо этого мы используем статусы. Статус «Активный» означает, что обращение требует ответа. Статус «В ожидании» означает, что вы ждете ответ от клиента и не хотите терять это обращение из вида. Статус «Закрыт» означает, что проблема решена и данный диалог можно закрыть. Статус «Спам» предназначен для обращений, которые случайно попали в ваш ящик и не требуют обработки.</p>
<p>Если вы закрыли обращение, а клиент ответил, то система автоматически вернет данному обращению Активный статус. Поэтому мы рекомендуем закрывать диалоги тогда, когда вы уверены, что дальше не последует ответа от клиента.</p>";
        $reply = ORM::factory('reply')->add_reply($ticket, $text, $client_name, $email, time() + 10, array(), true);  
    }
    
    public function generate_hash($length = 16)
    {
        $arr = array('a','b','c','d','e','f',
                 'g','h','i','j','k','l',
                 'm','n','o','p','r','s',
                 't','u','v','x','y','z',
                 'A','B','C','D','E','F',
                 'G','H','I','J','K','L',
                 'M','N','O','P','R','S',
                 'T','U','V','X','Y','Z',
                 '1','2','3','4','5','6',
                 '7','8','9','0',);
                 
        // Генерируем
        $pass = '';
        for($i = 0; $i < $length; $i++) {
            // Вычисляем случайный индекс массива
            $index = rand(0, count($arr) - 1);
            $pass .= $arr[$index];
        }
        return $pass;
    }
    
    public function edit_mailbox($email, $name)
    {  
        $company = ORM::factory('company')->get_current();
        if (!$company->loaded()) {
            throw new Model_Exception('Неизвестная компания');   
        }
        
        $email      = Security::xss_clean($email);
        $name       = Security::xss_clean($name);
                 
        $this->email      = $email;
        $this->name       = $name;
        $this->save();
        
        return $this;
    }
    
    public function mark_mailbox_as_deleted()
    {
        $this->status = self::STATUS_DELETED;
        $this->save(); 
    }
    
}